/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op.filtros;

import core.FiltraLigacao;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import op.ContaTelefonica;
import op.Ligacao;

/**
 *
 * @author Jônatas
 */
public class FiltraPorData implements FiltraLigacao {

    private Date dataInicio;
    private Date dataFim;

    public FiltraPorData(Date dataInicio, Date dataFim) {
        this.dataInicio = dataInicio;
        this.dataFim = dataFim;
    }

    public FiltraPorData(int diaInicio, int mesInicio, int anoInicio,
            int diaFim, int mesFim, int anoFim) {

        Calendar calendar = Calendar.getInstance();
        calendar.set(anoInicio, (mesInicio - 1), diaInicio);
        dataInicio = calendar.getTime();

        calendar = Calendar.getInstance();
        calendar.set(anoFim, (mesFim - 1), diaFim);
        dataFim = calendar.getTime();

    }

    public ContaTelefonica execute(ContaTelefonica contaOriginal) {

        List<Ligacao> ligacoesOriginais = contaOriginal.getLigacoes();
        List<Ligacao> ligacoesFiltradas = new ArrayList<Ligacao>();

        for (Ligacao lig : ligacoesOriginais) {

            Date dataLigacao = lig.getDataOrigemLigacao();

            if (dataLigacao == null) {
                continue;
            }

            Calendar calendar = Calendar.getInstance();
            calendar.setTime(dataLigacao);

            int ano = calendar.get(Calendar.YEAR);
            int mes = calendar.get(Calendar.MONTH);
            int dia = calendar.get(Calendar.DATE);

            calendar.setTime(dataInicio);

            int anoInicio = calendar.get(Calendar.YEAR);
            int mesInicio = calendar.get(Calendar.MONTH);
            int diaInicio = calendar.get(Calendar.DATE);

            calendar.setTime(dataFim);

            int anoFim = calendar.get(Calendar.YEAR);
            int mesFim = calendar.get(Calendar.MONTH);
            int diaFim = calendar.get(Calendar.DATE);


            if ((anoInicio < ano) || ((anoInicio == ano) && (mesInicio < mes))
                    || ((anoInicio == ano) && (mesInicio == mes) && (diaInicio <= dia))) {


                if (ano < anoFim || ((ano == anoFim) && (mes < mesFim))
                        || ((anoFim == ano) && (mesFim == mes) && (dia <= diaFim))) {
                    ligacoesFiltradas.add(lig);
                }
            }
        }

        ContaTelefonica resposta = new ContaTelefonica(contaOriginal.getContaMensal());
        resposta.setLigacoes(ligacoesFiltradas);
        return resposta;
    }
}
